关于最短路径中的Dijkstra和Bell-man算法的区别

Bell-man算法和Dijkstra算法都是最短路径的算法,都可以用于求,单源点最短路径的问题,那么它们的区别在于什么呢?

想了很久,该怎样去总结它们的区别,最后我认为从两方面总结,是比较合适的:用途特性,算法本身的区别。

那么算法适用于什么样的情况,应该是有算法本身的特性来决定的,所以,算法本身的区别是关键,下面就来说明两个算法各自最核心的部分:

Dijkstra:

1. 初始化:将d[ ] 全部设为INF,特别的是d[s] = 0; 将标记数组vis[ ] 全部设为1,特别的是vis[s] = 1;

2. for ( int i = 0; i < n; ++i ) {  

                 在所有未标记的结点中,选择最小的x, 然后从x开始,修改其他结点的d[i]值d[i] <?= d[x] + w[x][i];

    }

其实就是将所有分成了两个部分,标记和未标记,然后在所有未标记的集合中,选最小的,加入到标记中,从这个结点开始,修改其他节点的最短路。可以证明,这个算法是正确的,它包含了DP和贪心的思想。


Bell-man: 

与Dijkstra不同的是,这个算法每次只是从队头拿出结点,修改与之相邻的节点,即进行松弛操作,d[i] <?= d[u]+w[u][i];

并不会找d[i]最小的点,它是通过动态的修正、收敛来实现最短路径的。

1. 初始化:queue, d[i] = INF, d[s] = 0, vis[i] = false, vis[s] = 0;

2. while ( !empty(queue) ) {

                   u = front; vis[u]=false;

                   for( i = 0; i < n; ++i )  if(d[i] > d[u] + w[u][i] ) {

                              d[i] = d[u]+w[u][i]; if ( !vis[i] ) {vis[i] = true; push(i);}

                   }

 }


用途特性:

主要从时间复杂度来分析,D是n*n, B是m*n, 可以看出,如果边比较多的情况下,姐稠密图,用D比较稳定,而稀疏图中,B是首选!

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值